ReactDOM yordamida React'ning DOM bilan ishlash asoslarini o'rganing. Mijoz tomonida rendering, portallar, gidratatsiyani o'zlashtiring va Server-Side Rendering (SSR) bilan global unumdorlik va SEO afzalliklariga ega bo'ling.
React Quvvatini Ochish: ReactDOM va Server-Side Renderingga Chuqur Kirish
Keng React ekotizimida biz ko'pincha komponentlar, holat (state) va hooklarga e'tibor qaratamiz. Biroq, bizning deklarativ komponentlarimizni veb-brauzerda sezilarli, interaktiv foydalanuvchi interfeyslariga aylantiradigan sehr muhim bir kutubxona orqali amalga oshiriladi: react-dom. Ushbu paket React'ning mavhum Virtual DOM va foydalanuvchilar ko'radigan va o'zaro aloqada bo'ladigan aniq Hujjat Ob'ekt Modeli (DOM) o'rtasidagi muhim ko'prikdir. Global auditoriya uchun ilovalar yaratayotgan dasturchilar uchun react-domdan samarali foydalanishni tushunish yuqori unumdorlikka ega, qulay va qidiruv tizimlari uchun do'stona tajribalar yaratishning kalitidir.
Ushbu keng qamrovli qo'llanma sizni react-dom kutubxonasi bilan chuqur tanishtiradi. Biz mijoz tomonida rendering asoslaridan boshlaymiz, portallar kabi kuchli utilitalarni o'rganamiz va keyin e'tiborimizni Server-Side Rendering (SSR)ning o'zgartiruvchi paradigmasiga va uning butun dunyo bo'ylab unumdorlik va SEOga ta'siriga qaratamiz.
ReactDOM bilan Mijoz Tomonida Rendering (CSR) Asosi
Aslida, React abstraksiya tamoyili asosida ishlaydi. Biz ma'lum bir holat uchun UI qanday ko'rinishi kerakligini tavsiflaymiz va React buni qanday amalga oshirishni o'zi hal qiladi. Create React App kabi vositalar bilan yaratilgan ilovalar uchun standart bo'lgan mijoz tomonida rendering (CSR) modeli aniq bir jarayonga amal qiladi:
- Brauzer veb-sahifani so'raydi va katta JavaScript to'plamiga havolasi bo'lgan minimal HTML faylini oladi.
- Brauzer JavaScript to'plamini yuklab oladi va ishga tushiradi.
- React boshqaruvni o'z qo'liga oladi, xotirada Virtual DOMni yaratadi va keyin
react-domyordamida butun ilovani ma'lum bir DOM elementiga (odatda<div id="root"></div>) render qiladi. - Endi foydalanuvchi ilovani ko'rishi va u bilan ishlashi mumkin.
Bu jarayon zamonaviy React ilovalarida yagona, kuchli kirish nuqtasi tomonidan boshqariladi.
Zamonaviy API: `ReactDOM.createRoot()`
Agar siz React bilan bir necha yil ishlagan bo'lsangiz, ReactDOM.render() bilan tanish bo'lishingiz mumkin. Biroq, React 18 chiqqandan so'ng, mijoz tomonida render qilinadigan ilovani ishga tushirishning rasmiy va tavsiya etilgan usuli ReactDOM.createRoot()dan foydalanishdir.
Nima uchun o'zgardi? Yangi root API React'ning bir vaqtda bir nechta UI versiyasini tayyorlashga imkon beruvchi konkurent (concurrent) xususiyatlarini yoqadi. Bu unumdorlikni oshirish va transitions kabi yangi xususiyatlar uchun asosdir. Eskirgan ReactDOM.render()dan foydalanish ilovangizni ushbu zamonaviy imkoniyatlardan mahrum qiladi.
Oddiy React ilovasini qanday ishga tushirish mumkinligi quyida ko'rsatilgan:
// index.js - Ilovangizning kirish nuqtasi
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
// 1. React ilovasi ulanadigan DOM elementini toping.
const rootElement = document.getElementById('root');
// 2. Ushbu element uchun root yarating.
const root = ReactDOM.createRoot(rootElement);
// 3. Asosiy App komponentingizni root ichiga render qiling.
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
Ushbu oddiy, nafis kod bloki deyarli har bir mijoz tomonidagi React ilovasining asosidir. root.render() metodi UI'ni yangilash uchun bir necha marta chaqirilishi mumkin; React yangi Virtual DOM daraxtini avvalgisi bilan solishtirib va faqat kerakli o'zgarishlarni haqiqiy DOMga qo'llab, yangilanishlarni samarali boshqaradi.
Asoslardan Tashqari: Muhim ReactDOM Utilitilari
createRoot asosiy kirish nuqtasi bo'lsa-da, react-dom keng tarqalgan, ammo murakkab UI muammolarini hal qilish uchun bir nechta boshqa kuchli utilitalarni taqdim etadi.
Chegaralardan Chiqish: `createPortal`
Hech qachon modal, maslahat (tooltip) yoki bildirishnoma oynasini yaratishga harakat qilib, CSS stek konteksti (z-index) yoki ajdodning overflow: hidden xususiyati tufayli kesilish muammolariga duch kelganmisiz? Bu klassik UI muammosi. Komponent mantig'i nuqtai nazaridan, modal sizning komponentlar daraxtingizning chuquridagi tugmachaga tegishli bo'lishi mumkin. Ammo vizual jihatdan, u ushbu CSS cheklovlaridan qochish uchun DOMning yuqori darajasida, ko'pincha <body>ning to'g'ridan-to'g'ri bolasi sifatida render qilinishi kerak.
Aynan shu muammoni ReactDOM.createPortal hal qiladi. U komponentning bolalarini ota-onasining DOM ierarxiyasidan tashqarida, DOMning boshqa qismiga render qilishga imkon beradi, shu bilan birga React komponentlar daraxtidagi o'rnini saqlab qoladi. Bu shuni anglatadiki, voqealarning yuqoriga tarqalishi (event bubbling) siz kutgandek ishlaydi — portaldan kelib chiqqan voqea React daraxtidagi o'zining ajdodlariga tarqaladi, hatto bu ajdodlar DOMda uning to'g'ridan-to'g'ri ota-onalari bo'lmasa ham.
Misol: Qayta Ishlatiladigan Modal Komponenti
// Modal.js
import React from 'react';
import ReactDOM from 'react-dom';
// public/index.html faylingizda <div id="modal-root"></div> bor deb faraz qilamiz
const modalRoot = document.getElementById('modal-root');
const Modal = ({ children }) => {
const el = document.createElement('div');
React.useEffect(() => {
// Ulanganda, elementni modal root'ga qo'shing.
modalRoot.appendChild(el);
// O'chirilganda, elementni olib tashlab tozalang.
return () => {
modalRoot.removeChild(el);
};
}, [el]);
// Bolalarni alohida DOM tuguniga render qilish uchun createPortal'dan foydalaning.
return ReactDOM.createPortal(children, el);
};
export default Modal;
// App.js
import React, { useState } from 'react';
import Modal from './Modal';
function App() {
const [showModal, setShowModal] = useState(false);
return (
<div>
<h1>Mening Ilovam</h1>
<button onClick={() => setShowModal(true)}>Modalni Ko'rsatish</button>
{showModal && (
<Modal>
<div className="modal-content">
<h2>Bu Portal Modal!</h2>
<p>U '#modal-root'da render qilinadi, lekin uning holati App.js tomonidan boshqariladi</p>
<button onClick={() => setShowModal(false)}>Yopish</button>
</div>
</Modal>
)}
</div>
);
}
Sinxron Yangilanishlarni Majburlash: `flushSync`
React unumdorlik borasida juda aqlli. Uning asosiy optimallashtirishlaridan biri bu holatlarni guruhlashdir (state batching). Bitta voqea ishlovchisida bir nechta holatni yangilash funksiyasini chaqirganingizda, React har biridan keyin darhol qayta render qilmaydi. Buning o'rniga, u ularni bir guruhga to'playdi va oxirida yagona, samarali qayta render qiladi. Bu keraksiz oraliq renderlarning oldini oladi.
Biroq, kamdan-kam hollarda siz React'ni DOM yangilanishlarini sinxron tarzda qo'llashga majbur qilishingiz kerak bo'lishi mumkin. Masalan, unga ta'sir qiluvchi holat o'zgarishidan so'ng darhol DOM elementining o'lchami yoki pozitsiyasini o'qishingiz kerak bo'lishi mumkin. Aynan shu yerda flushSync yordamga keladi.
flushSync bu chetlab o'tish yo'li. Siz holat yangilanishini unga o'raysiz va React yangilanishni sinxron ravishda bajaradi va undan keyingi kodni ishga tushirishdan oldin o'zgarishlarni DOMga yozadi.
Ehtiyotkorlik bilan foydalaning! flushSyncni haddan tashqari ko'p ishlatish guruhlashning unumdorlik afzalliklarini yo'qqa chiqarishi mumkin. U odatda faqat uchinchi tomon kutubxonalari bilan ishlash yoki murakkab animatsiyalar va joylashuv mantig'i uchun kerak bo'ladi.
import { flushSync } from 'react-dom';
function ListComponent() {
const [items, setItems] = useState(['A', 'B', 'C']);
const listRef = React.useRef();
const handleAddItem = () => {
// Aytaylik, element qo'shgandan so'ng darhol pastga aylantirishimiz kerak.
flushSync(() => {
setItems(prev => [...prev, 'D']);
});
// Bu qator ishga tushguncha, DOM yangilanadi. Yangi 'D' elementi render qilinadi.
// Endi biz ro'yxatning yangi balandligini ishonchli o'lchashimiz va aylantirishimiz mumkin.
listRef.current.scrollTop = listRef.current.scrollHeight;
};
return (
<div>
<ul ref={listRef} style={{ height: '100px', overflow: 'auto' }}>
{items.map(item => <li key={item}>{item}</li>)}
</ul>
<button onClick={handleAddItem}>Element Qo'shish va Aylantirish</button>
</div>
);
}
O'tmish Haqida Eslatma: `findDOMNode` (Eskirgan)
Eski kod bazalarida siz findDOMNodega duch kelishingiz mumkin. Bu funksiya sinf komponenti namunasidan asosiy brauzer DOM tugunini olish uchun ishlatilgan. Biroq, hozirda u eskirgan hisoblanadi va undan foydalanish qat'iyan tavsiya etilmaydi.
Buning asosiy sababi, u komponent abstraksiyasini buzadi. Ota-ona komponent DOM tugunini topish uchun o'zining bola komponentining ichki tafsilotlariga aralashmasligi kerak. Bu komponentlarni mo'rt va refaktor qilishni qiyinlashtiradi. Bundan tashqari, funksional komponentlar va hooklarning rivojlanishi bilan findDOMNode ular bilan umuman ishlamaydi.
Zamonaviy va to'g'ri yondashuv bu reflar va ref forwardingdan foydalanishdir. Bola komponent forwardRef orqali aniq bir DOM tugunini o'z ota-onasiga ochiq ko'rsatishi mumkin, bu esa aniq va shaffof shartnomani saqlab qoladi.
Paradigma O'zgarishi: ReactDOM bilan Server-Side Rendering (SSR)
CSR murakkab, interaktiv ilovalar yaratish uchun kuchli bo'lsa-da, uning ikkita muhim kamchiligi bor, ayniqsa global foydalanuvchilar bazasi uchun:
- Boshlang'ich Yuklanish Unumdorligi: Butun JavaScript to'plami yuklab olinmaguncha, tahlil qilinmaguncha va ishga tushirilmaguncha foydalanuvchi bo'sh oq ekranni ko'radi. Dunyoning ko'p qismlarida keng tarqalgan sekin tarmoqlar yoki kam quvvatli qurilmalarda bu juda uzoq kutish vaqtiga olib kelishi mumkin.
- Qidiruv Tizimlarini Optimallashtirish (SEO): Qidiruv tizimi skanerlari JavaScriptni bajarishda yaxshilangan bo'lsa-da, ular mukammal emas. Deyarli bo'sh HTML faylini qaytaradigan server skanerdan sahifani render qilishni talab qiladi, bu esa boshidanoq to'liq shakllangan HTML kontentini taqdim etadigan sahifaga nisbatan to'liq bo'lmagan indeksatsiyaga yoki pastroq reytinglarga olib kelishi mumkin.
Server-Side Rendering (SSR) bu muammolarni to'g'ridan-to'g'ri hal qiladi. SSR bilan React ilovangizning dastlabki renderingi serverda amalga oshiriladi. Server so'ralgan sahifa uchun to'liq HTMLni yaratadi va uni brauzerga yuboradi. Foydalanuvchi darhol kontentni ko'radi — bu sezilgan unumdorlik va SEO uchun katta yutuqdir.
`react-dom/server` Paketi
Ushbu server tomonidagi sehrni amalga oshirish uchun React alohida paketni taqdim etadi: react-dom/server. Ushbu paketda komponentlarni DOM bo'lmagan muhitda, masalan, Node.js serverida render qilish uchun kerakli vositalar mavjud.
Ikkita asosiy metod mavjud:
renderToString(element): Bu SSRning asosiy ishchisi. U React elementini (masalan, sizning<App />komponentingizni) oladi va uni statik HTML satriga render qiladi. Bu satr React mijoz tomonida gidratatsiya deb nomlanuvchi jarayon uchun ishlatadigan maxsus `data-reactroot` atributlarini o'z ichiga oladi.renderToStaticMarkup(element): Bu o'xshash, ammo u qo'shimcha `data-reactroot` atributlarini o'tkazib yuboradi. Bu mijozda gidratatsiya qilinmaydigan sof, statik HTML yaratmoqchi bo'lganingizda foydalidir. Elektron pochta shablonlari uchun HTML yaratish ajoyib misoldir.
Boshqotirmaning So'nggi Qismi: Gidratatsiya
Server tomonidan yaratilgan HTML shunchaki statik belgilashdir. U to'g'ri ko'rinadi, lekin interaktiv emas. Tugmalar ishlamaydi va mijoz tomonida holat yo'q. Ushbu statik HTMLni interaktiv qilish jarayoni gidratatsiya deb ataladi.
Brauzer serverda render qilingan HTMLni olgandan so'ng, u CSR holatidagi kabi bir xil JavaScript to'plamini ham yuklab oladi. Ammo butun DOMni noldan qayta yaratish o'rniga, React mavjud HTMLni o'z nazoratiga oladi. U serverda render qilingan DOM daraxtini aylanib chiqadi, kerakli voqea tinglovchilarini (masalan, onClick) biriktiradi va ilovaning holatini ishga tushiradi. Bu jarayon uzluksiz va DOMni noldan qurishdan ancha tezroq.
Mijozda gidratatsiyani yoqish uchun siz createRoot() o'rniga ReactDOM.hydrateRoot()dan foydalanasiz.
Soddalashtirilgan SSR Jarayoni Misoli (serverda Express.js yordamida):
// server.js
import express from 'express';
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import App from './src/App';
const app = express();
app.get('/', (req, res) => {
// 1. React App komponentini HTML satriga render qiling.
const appHtml = ReactDOMServer.renderToString(<App />);
// 2. Render qilingan HTML'ni shablonga joylashtiring.
const html = `
<!DOCTYPE html>
<html>
<head>
<title>React SSR App</title>
</head>
<body>
<div id="root">${appHtml}</div>
<script src="/client.js"></script> <!-- Mijoz tomonidagi JS to'plami -->
</body>
</html>
`;
// 3. To'liq HTML hujjatini mijozga yuboring.
res.send(html);
});
app.listen(3000, () => {
console.log('Server 3000-portda ishlamoqda');
});
// client.js - Mijoz tomonidagi kirish nuqtasi
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const rootElement = document.getElementById('root');
// 1. createRoot o'rniga hydrateRoot'dan foydalaning.
// React DOM'ni qayta yaratmaydi, balki voqea tinglovchilarini biriktiradi
// mavjud serverda render qilingan belgilashga.
ReactDOM.hydrateRoot(
rootElement,
<React.StrictMode>
<App />
</React.StrictMode>
);
Gidratatsiya uchun mijozda render qilingan komponentlar daraxti serverda render qilingani bilan bir xil bo'lishi juda muhim. Nomuvofiqliklar gidratatsiya xatolariga va oldindan aytib bo'lmaydigan xatti-harakatlarga olib kelishi mumkin.
To'g'ri Strategiyani Tanlash: CSR va SSR
CSR va SSR o'rtasidagi qaror qaysi biri universal "yaxshiroq" ekanligi haqida emas, balki sizning maxsus ilovangiz ehtiyojlari uchun qaysi biri yaxshiroq ekanligi haqida. Next.js va Remix kabi freymvorklar SSRni ancha osonlashtirdi, ammo uning afzalliklari va kamchiliklarini tushunish hali ham muhim.
Mijoz Tomonida Renderingni (CSR) Qachon Tanlash Kerak:
- Yuqori Interaktiv Boshqaruv Panellari va Admin Panellari: Tizimga kirish devori ortidagi, SEO ahamiyatsiz va foydalanuvchilar barqaror, tezkor ulanishlarda bo'lgan ilovalar uchun CSRning soddaligi ko'pincha afzalroqdir.
- Ichki Vositalar: Birinchi sahifa yuklanishi uchun unumdorlik dasturlash tezligi va soddaligidan kamroq muhim bo'lganda.
- Konsepsiya Isbotlari va MVP'lar: CSR odatda sozlash va joylashtirish uchun tezroq, bu esa uni tez prototiplash uchun ideal qiladi.
Server-Side Renderingni (SSR) Qachon Tanlash Kerak:
- Ommaga Ochiq Kontent Veb-saytlari: Bloglar, yangiliklar saytlari, marketing sahifalari va qidiruv tizimlarida topilishi muhim bo'lgan har qanday sayt uchun.
- Elektron Tijorat Platformalari: Mahsulot sahifalari tez yuklanishi va sotuvlarni oshirish uchun qidiruv tizimlari va ijtimoiy media skanerlari tomonidan mukammal indekslanishi kerak.
- Global Auditoriyaga Mo'ljallangan Ilovalar: Foydalanuvchilaringiz sekinroq internet aloqasiga yoki kamroq quvvatli qurilmalarga ega bo'lishi mumkin bo'lganda, oldindan render qilingan HTMLni yuborish dastlabki foydalanuvchi tajribasini sezilarli darajada yaxshilaydi.
Shuningdek, Statik Sayt Generatsiyasi (SSG), ya'ni sahifalar qurish vaqtida HTMLga oldindan render qilinadi, va Inkremental Statik Regeneratsiya (ISR), ya'ni statik sahifalarni joylashtirilgandan keyin vaqti-vaqti bilan yangilashga imkon beruvchi gibrid yondashuvlar mavjudligini ta'kidlash joiz. Bular SSRning unumdorlik afzalliklarini kamroq server xarajatlari bilan taqdim etadi.
Xulosa: DOMga Ko'p Qirrali Ko'prik
react-dom paketi oddiy render qilish vositasidan ancha ko'proq; bu dasturchilarga React ilovalarining brauzer bilan qanday o'zaro ishlashini nozik nazorat qilish imkonini beruvchi murakkab kutubxonadir. Mijoz tomonidagi ilovalar uchun asosiy createRootdan tortib, murakkab UIlar uchun createPortal kabi kuchli utilitalargacha, u zamonaviy veb-dasturlash uchun zarur vositalarni taqdim etadi.
Eng muhimi, react-dom/server va hydrateRoot orqali ishonchli server tomonida rendering va gidratatsiya mexanizmini taqdim etish orqali React dasturchilarga nafaqat interaktiv va dinamik, balki turli xil, global auditoriya uchun unumdor va SEOga do'stona ilovalar yaratish imkoniyatini beradi. Ushbu rendering strategiyalarini tushunish va loyihangiz uchun to'g'risini tanlash malakali React dasturchisining belgisidir, bu sizga har bir foydalanuvchiga, ular qayerda bo'lishidan va qanday qurilmadan foydalanishidan qat'i nazar, eng yaxshi tajribani taqdim etish imkonini beradi.